package com.bnz.proxy.dyna;

import com.bnz.proxy.UserDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理
 */

public class UserDaoJDKDynzImpl implements InvocationHandler {

    // 1、引入目标对象（要被代理的）
    private UserDao userDao;
    // 2、添加构造方法
    public UserDaoJDKDynzImpl(UserDao userDao){
        this.userDao = userDao;
    }

    // 3、生成代理对象
    public UserDao createProxy(){
        // 3.1、创建代理对像
        // 参数说明: ①代表当前对象的类加载器；②代表目标对象所实现的接口类型的数组；
        // ③(this)代表实现了InvocationHandler接口的对象
        return (UserDao) Proxy.newProxyInstance(UserDaoJDKDynzImpl.class.getClassLoader(),
                                       userDao.getClass().getInterfaces(),this);
    }

    // 4、调用不同的目标方法
    // proxy:代理对象;  method:要调用的方法;  args:方法的参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 4.1、条件(如果名字为update，调用之前加上安全性检查)
        if(method.getName().equals("update")){
            ck();
        }
        // 4.2、调用方法(要传代理的对象，参数)
        Object invoke = method.invoke(userDao, args);
        return invoke;
    }

    // 5、安全性检查
    private void ck(){
        System.out.println("【JDK动态代理】方法调用前，执行安全性检查");
    }
}
